package br.com.playonline.bussines;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.playonline.domain.Bolao;
import br.com.playonline.domain.Carrinho;
import br.com.playonline.domain.CarrinhoBolao;
import br.com.playonline.domain.TipoDeJogo;
import br.com.playonline.domain.Usuario;
import br.com.playonline.dto.CarrinhoAdicionarBolaoDTO;
import br.com.playonline.dto.CarrinhoConverterList;
import br.com.playonline.dto.CarrinhoDTO;
import br.com.playonline.persistencia.BolaoHibernateDAO;
import br.com.playonline.persistencia.CarrinhoBolaoHibernateDAO;
import br.com.playonline.persistencia.CarrinhoHibernateDAO;
import br.com.playonline.persistencia.UsuarioHibernateDAO;

@Component
public class CarrinhoBU {

	@Autowired
	UsuarioHibernateDAO usuarioHibernateDAO;

	@Autowired
	CarrinhoHibernateDAO carrinhoHibernateDAO;

	@Autowired
	BolaoHibernateDAO bolaoHibernateDAO;

	@Autowired
	CarrinhoBolaoHibernateDAO carrinhoBolaoHibernateDAO;

	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public String adicionarBolao(CarrinhoConverterList carrinhoConverterList) {
		Usuario usuario = this.usuarioHibernateDAO
				.findById(carrinhoConverterList.getIdUsuario());

		if (usuario != null) {
			if (usuario.getSaldo() < carrinhoConverterList
					.getValorTotal()) {
				return "Saldo insuficiente";
			}
			usuario.setSaldo(usuario.getSaldo() - carrinhoConverterList.getValorTotal());
			this.usuarioHibernateDAO.update(usuario);//SALVA USUARIO COM NOVO SALDO EM JOGO
			Carrinho carrinho = usuario.getCarrinho();
			for (CarrinhoAdicionarBolaoDTO carrinhoAdicionarBolaoDTO : carrinhoConverterList
					.getCarrinhoAdicionarBolaoDTOs()) {
				Bolao bolao = this.bolaoHibernateDAO
						.findById(carrinhoAdicionarBolaoDTO.getIdBolao());
				CarrinhoBolao carrinhoBolao = new CarrinhoBolao();
				carrinhoBolao = new CarrinhoBolao();
				carrinhoBolao.setCarrinho(carrinho);
				carrinhoBolao.setBolao(bolao);
				carrinhoBolao
						.setQtdCota(carrinhoAdicionarBolaoDTO.getQtdCota());
				carrinhoBolao.setDtCompra(new Date());

				//ATUALIZA COTAS VENDIDAS
				bolao.setQtdCotasVendidas(carrinhoAdicionarBolaoDTO.getQtdCota() + (bolao.getQtdCotasVendidas() == null ? 0 : bolao.getQtdCotasVendidas()));
				this.bolaoHibernateDAO.update(bolao);
				
				this.carrinhoBolaoHibernateDAO.save(carrinhoBolao);
			}
		}
		return "success";
	}

	// TODO Retirar metodo
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public List<CarrinhoDTO> findCarrinhoByUsuario(Long idUsuario) {
		Usuario usuario = this.usuarioHibernateDAO.findById(idUsuario);
		Carrinho carrinho = usuario.getCarrinho();
		List<CarrinhoBolao> carrinhoBolaos = carrinho.getCarrinhoBolaos();
		List<CarrinhoDTO> carrinhoDTOs = new ArrayList<CarrinhoDTO>();

		for (CarrinhoBolao carrinhoBolao : carrinhoBolaos) {
			CarrinhoDTO carrinhoDTO = new CarrinhoDTO();
			carrinhoDTO.setId(carrinhoBolao.getCarrinho().getId());
			carrinhoDTO.setIdentificadorBolao(carrinhoBolao.getBolao()
					.getIdentificadorGrupo());
			carrinhoDTO.setQtdCota(carrinhoBolao.getQtdCota());
			carrinhoDTO.setTipoDeJogo(carrinhoBolao.getBolao().getTipoDeJogo()
					.getLabel());
			carrinhoDTO.setValorCota(carrinhoBolao.getBolao().getValorCota());
			carrinhoDTO.setIdBolao(carrinhoBolao.getBolao().getId());
			carrinhoDTOs.add(carrinhoDTO);
		}
		return carrinhoDTOs;
	}

	// TODO Retirar metodo
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public void removerTodos(Long idUsuario) {
		Usuario usuario = this.usuarioHibernateDAO.findById(idUsuario);
		List<CarrinhoBolao> carrinhoBolaos = usuario.getCarrinho()
				.getCarrinhoBolaos();
		for (CarrinhoBolao carrinhoBolao : carrinhoBolaos) {
			this.carrinhoBolaoHibernateDAO.delete(carrinhoBolao);
		}
	}

	// TODO Retirar metodo
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public void removerByBolao(CarrinhoAdicionarBolaoDTO adicionarBolaoDTO) {
		// List<CarrinhoBolao> carrinhoBolaos =
		// this.carrinhoBolaoHibernateDAO.findByCarrinhoAndBolao(adicionarBolaoDTO.getIdBolao(),
		// adicionarBolaoDTO.getIdCarrinho());
		// for(CarrinhoBolao carrinhoBolao : carrinhoBolaos){
		// this.carrinhoBolaoHibernateDAO.delete(carrinhoBolao);
		// }
	}

	// private String getTipoDeJogo(Integer tipo){
	// String tipoDeJogo = "";
	// if(tipo == 1){
	// tipoDeJogo = "Mega Sena";
	// }else if(tipo == 2){
	// tipoDeJogo = "Quina";
	// }else if(tipo == 3){
	// tipoDeJogo = TipoDeJogo.LOTO_MANIA;
	// }else if(tipo == 4){
	// tipoDeJogo = TipoDeJogo.DUPLA_SENA;
	// }else if(tipo == 4){
	// tipoDeJogo = TipoDeJogo.LOTO_FACIL;
	// }
	// return tipoDeJogo;
	// }

}
